package com.zyj.core.sqlnode;

import java.util.HashMap;
import java.util.Map;

/**
 * 1、用于拼接SqlNode解析之后的SQL片段
 * 2、用于传递解析SqlNode时需要的参数信息
 */
public class DynamicContext {

    // 使用StringBuffer不断的去拼接已经完成解析工作的sql片段
    private StringBuffer sb = new StringBuffer();

    // 在进行sql解析时需要使用到sql参数，也需要通过DynamicContext来传递给sqlNode对象去使用
    // 比如说解析ifsqlnode时，OGNL需要根据参数值以及test条件来判断if条件是否成立，进而判断是否需要解析及拼接ifsqlnode中的sql片段
    // 在解析${}时，也需要使用参数值去替换${}
    // 在解析${}，直接根据客户端传入的param中的参数值使用字符串替换，因此存在sql注入问题
    private Map<String, Object> bindings = new HashMap<>();

    /**
     * 通过构造方法，注入入参信息
     *
     * @param param 由框架调用方传入的参数，例如如下map
     *              Map map = new HashMap();
     *              map.put("username", "千年老亚瑟");
     *              map.put("sex", "男");
     */
    public DynamicContext(Object param) {
        this.bindings.put("_parameter", param);
    }

    public String getSql() {
        return sb.toString();
    }

    /**
     * 按顺序拼接每一段解析完${}的sql片段，等待整个sql语句拼接结束之后才会单独处理#{}
     *
     * @param sqlText
     */
    public void appendSql(String sqlText) {
        this.sb.append(sqlText);
        this.sb.append(" ");
    }

    public Map<String, Object> getBindings() {
        return bindings;
    }

}
